let arr = [1, [[[1,2]]] ,3, 4]
let newArr = arr.flat(Infinity)
console.log(newArr);

// let res = []
// function myflat(arr) {
//     for(let i = 0; i < arr.length;i++) {
//         if(Array.isArray(arr[i])) { // instanceof
//            myflat(arr[i])
//         } else {
//             res.push(arr[i])
//         }
//     }

// return res
// }
// console.log(myflat(arr));


function myflat(arr) {
    let res = []
    for (let item of arr) {
      // if (item instanceof Array) { // Array.isArray(item)
      //   res = res.concat(myflat(item))
      // } else {
      //   res.push(item)
      // }
      item instanceof Array ? res = res.concat(myflat(item)) : res.push(item)
    }
    return res
  }
  


function myflat2(arr) {
    const str = `[${JSON.stringify(arr).replace(/(\[|\])/g,'')}]`
    return JSON.parse(str)
}
// console.log(myflat2(arr));



function myflat3(arr) {
    while(arr.some(Array.isArray)) {
        arr = [].concat(...arr)
    }
    return arr
}
console.log(myflat3(arr));